osc_scoresheetsfandomcom_pl-20200213-history
Moduł:Sports results
Module to build results cross-tables for standings in Sports -- See documentation for details require('Module:No globals') local p = {} -- Main function function p.main(frame) -- Declare locals local Args = frame.args local N_teams = 0 local t = {} local t_footer = {} local t_return = {} local team_list = {} local notes_exist = false local ii, ii_fw, bg_col, team_name, team_code_ii -- Optional custom team header local team_header = Args'team_header' or 'Home \\ Away' -- Edit links if requested local template_name = Args'template_name' or '' local edit_links = template_name '' and '' or frame:expandTemplate{ title = 'navbar', args = { mini=1, style='float:right', template_name} } -- Load some other modules local p_sub = require('Module:Sports table/sub') -- Read in number of consecutive teams (ignore entries after skipping a spot) while Args'team'..N_teams+1 ~= nil do N_teams = N_teams+1 -- Sneakily add it twice to the team_list parameter, once for the actual -- ranking, the second for position lookup in sub-tables -- This is possible because Lua allows both numbers and strings as indices. team_listN_teams = Args'team'..N_teams -- i^th entry is team X team_list[Args'team'..N_teams] = N_teams -- team X entry is position i end -- Get team to show local ii_show = team_list[Args'showteam'] -- nil if non-existant -- Set the font size local font_size=Args'font_size' or '100%' -- Create header -- Open table table.insert(t,' \n') -- Get info for footer local update = Args'update' or 'unknown' local start_date = Args'start_date' or 'unknown' local source = Args'source' or frame:expandTemplate{ title = 'citation needed', args = { reason='No source parameter defined', date=os.date('%B %Y') } } -- Create footer text -- Date updating if string.lower(update) 'complete' then -- Do nothing elseif update '' then -- Empty parameter table.insert(t_footer,'Updated to match(es) played on unknown. ') elseif string.lower(update) 'future' then -- Future start date table.insert(t_footer,'First match(es) will be played on '..start_date..'. ') else table.insert(t_footer,'Updated to match(es) played on '..update..'. ') end table.insert(t_footer,'Source: '..source) if (Args'matches_style' or ) 'FBR' then table.insert(t_footer, Args'team_header' and ' Colours: Blue = left column team win; Yellow = draw; Red = top row team win.' or ' Colours: Blue = home team win; Yellow = draw; Red = away team win.') elseif (Args'matches_style' or '') 'BSR' then table.insert(t_footer, Args'team_header' and ' Colours: Blue = left column team win; Red = top row team win.' or ' Colours: Blue = home team win; Red = away team win.') end if (Args'a_note' or '') ~= '' then table.insert(t_footer, ' For coming matches, an a indicates there is an article about the match.') end if (Args'ot_note' or '') ~= '' then table.insert(t_footer, ' Matches with background in a lighter colour were decided after overtime.') end -- Add notes (if applicable) if notes_exist then table.insert(t_footer,' Notes:') -- As reflist size text t_footer = ' '..table.concat(t_footer)..' ' t_footer = t_footer..frame:expandTemplate{ title = 'notelist', args = { group='Table_notes'} } else -- As reflist size text t_footer = ' '..table.concat(t_footer)..' ' end -- Add footer to main text table table.insert(t,t_footer) return table.concat(t) end -- Other functions local function get_short_name(s, t, n) -- return short name if defined if s and s ~= '' then return s end -- replace link text in name with team abbr if possible if n and t and n:match('(%[%^%[%*%]%])') then n = mw.ustring.gsub(n, '(%[%%*%|)%]*(%]%])', '%1' .. t .. '%2') n = mw.ustring.gsub(n, '(%[%%*)(%]%])', '%1|' .. t .. '%2') return n end -- nothing worked, so just return the unlinked team abbr return t or '' end local function get_score_background(s, c) local s1, s2 -- Define the colouring local wc, lc, tc if c 'level2' then wc, lc, tc = '#CCF9FF', '#FFCCCC', '#FFFFCC' -- blue2, red2, yellow2 elseif c 'level3' then wc, lc, tc = '#DDFCFF', '#FFDDDD', '#FFFFDD' -- blue3, red3, yellow3 elseif c 'level4' then wc, lc, tc = '#EEFFFF', '#FFEEEE', '#FFFFEE' -- blue4, red4, yellow4 else wc, lc, tc = '#BBF3FF', '#FFBBBB', '#FFFFBB' -- blue1, red1, yellow1 end -- delink if necessary if s:match('^%s*%[%^%[%*%|([^%%]*)%]%]') then s = s:match('^%s*%[%^%[%*%|([^%%]*)%]%]') end -- get the scores s1 = tonumber(mw.ustring.gsub( s or '', '^%s*(%d%d*)%s*–%s*(%d%d*).*', '%1' ) or '') or '' s2 = tonumber(mw.ustring.gsub( s or '', '^%s*(%d%d*)%s*–%s*(%d%d*).*', '%2' ) or '') or '' -- return colouring if possible if s1 ~= '' and s2 ~= '' then return (s1 > s2) and wc or ((s2 > s1) and lc or tc) else return 'transparent' end end local function format_score(s) s = mw.ustring.gsub(s or '', '^%s*(%d+)%s*–−—%-%s*(%d+)', '%1–%2') s = mw.ustring.gsub(s, '^%s*(%d+)%s*&MmNnDdAaSsHh;%s*(%d+)', '%1–%2') s = mw.ustring.gsub(s, '^%s*(%[%^%[%*%|%d+)%s*%-%s*(%d+)', '%1–%2') s = mw.ustring.gsub(s, '^%s*(%[%^%[%*%|%d+)%s*&MmNnDdAaSsHh;%s*(%d+)', '%1–%2') return s end function p.header(tt,Args,p_sub,N_teams,team_list) local ii, team_code_ii, short_name -- Set match column width local col_width = Args'match_col_width' or '28' -- Get some default values in case it doesn't start at 1 local top_pos = tonumber(Args'highest_pos') or 1 for ii=top_pos,N_teams do team_code_ii = team_listii short_name = get_short_name(Args'short_'..team_code_ii, team_code_ii, Args'name_'..team_code_ii) tt = p_sub.colhead(tt,col_width,short_name) end return tt end function p.row(tt,Args,N_teams,team_list,ii,ii_show) -- Note ii is the row number being shown local jj, fw, bg, result, result_extra, team_code_ii, team_code_jj local cell_bold = false -- Set score cell style local matches_style = Args'matches_style' or '' team_code_ii = team_listii -- Get some default values in case it doesn't start at 1 local top_pos = tonumber(Args'highest_pos') or 1 for jj=top_pos,N_teams do team_code_jj = team_listjj result = Args'match_'..team_code_ii..'_'..team_code_jj or '' result_extra = Args'result_'..team_code_ii..'_'..team_code_jj or '' if ii jj or result 'null' then -- Solid cell if ii ii_show then cell_bold = true else cell_bold = false end fw = cell_bold and 'font-weight: bold;' or 'font-weight: normal;' bg = 'background-color:transparent;' -- Grey background color for solid cell if Args'solid_cell' 'grey' then table.insert(tt,'| style="'..fw..'background-color:#BBBBBB;" |\n') else table.insert(tt,'| style="'..fw..bg..'" | —\n') end else -- Content cell -- Set bolding and background if ii ii_show or jj ii_show then cell_bold = true else cell_bold = false end fw = cell_bold and 'font-weight: bold;' or 'font-weight: normal;' bg = 'background-color:transparent;' -- Reformat dashes if result ~= '' then result = format_score(result) end -- Background coloring if enabled if matches_style 'FBR' and result ~= '' then if result_extra 'OT' then bg = 'background-color:' .. get_score_background(result,'level2') .. ';' elseif result_extra 'PK' then bg = 'background-color:' .. get_score_background(result,'level3') .. ';' else bg = 'background-color:' .. get_score_background(result,) .. ';' end elseif matches_style 'BSR' and result ~= '' then if result_extra 'OT' then bg = 'background-color:' .. get_score_background(result,'level3') .. ';' else bg = 'background-color:' .. get_score_background(result,'') .. ';' end end table.insert(tt,'| style="white-space:nowrap;'..fw..bg..'" |'..result..'\n') end end return tt end return p